home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル応用編
/
簡易エディタ
/
SEFILE.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
8KB
|
230 lines
/******************************************************************************
* sefile.c: ファイルのロード、セーブ処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <stat.h>
#include <io.h>
#include <doslib.h>
#include <sxmemory.h> /* メモリマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "sedit.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* readFile(): ファイルの読み込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: int >= 0: 読み込み成功
* = -1: 読み込み失敗
* = -2: ファイルが見付からない
*/
int readFile(ComVal *pcv, char *pname)
{
int hdlProp, fileLen, data, errCode, len;
FILE *fn;
fn = fopen(pname, "rb");
if (fn == NULL)
return -2;
pcv->editFlag = FALSE; /* 編集フラグをクリアする */
if ((*pcv->tEditHdl)->length) {
/* テキストエディットをすべて消去する */
TMHide(pcv->tEditHdl); /* 非表示属性にする */
/* 全範囲領域選択する(表示の変更はしない) */
TMCheckSel(pcv->tEditHdl, 0, (*pcv->tEditHdl)->length, (*pcv->tEditHdl)->length);
TMDelete(pcv->tEditHdl); /* セレクト部分を削除する */
TMCacheFlush(pcv->tEditHdl);
TMShow(pcv->tEditHdl); /* 表示属性に戻す */
}
fseek(fn, -1, SEEK_END);
fileLen = ftell(fn); /* ファイルサイズを求める */
fseek(fn, 0, SEEK_SET);
if (fileLen) {
/* ハンドルの属性を保存 */
hdlProp = MMHdlPropGet((*pcv->tEditHdl)->text);
/* ハンドルのロックを解除する */
MMHdlUnlock((*pcv->tEditHdl)->text);
/* ハンドルのサイズを変更する */
errCode = MMHdlSizeSet((*pcv->tEditHdl)->text, fileLen + 8);
/* ハンドルの属性を元に戻す */
MMHdlPropSet((*pcv->tEditHdl)->text, hdlProp);
if (errCode < 0) {
pcv->errorCode = 8; /* メモリが確保できなかった */
fclose(fn);
return -1;
}
len = fread((unsigned char *) *(*pcv->tEditHdl)->text, sizeof(char), (size_t) fileLen, fn);
/* バイナリモードでファイルをオープンしているので、
テキストの終了コード EOF('\x1a')を読み込まないようにする */
fseek(fn, -1, SEEK_END);
data = fgetc(fn);
if (data != '\x1a') {
/* ファイルの最後が EOF で終わってない場合 */
(*(*pcv->tEditHdl)->text)[len] = data;
len++;
fileLen++;
data = 0;
}
if (len < fileLen) {
pcv->errorCode = 11; /* リードエラー */
fclose(fn);
return -1;
}
TMHide(pcv->tEditHdl);
(*pcv->tEditHdl)->length = fileLen;
/* テキストエディットの段落情報を再計算する */
TMSetSelCal(pcv->tEditHdl, 0, 0, 0);
/* テキストエディットの先頭行までスクロールする */
TMPinScroll(pcv->tEditHdl);
TMShow(pcv->tEditHdl);
/* テキストエディット全体をアップデートする */
addUpdate(pcv->windowPtr, &pcv->view);
}
fclose(fn);
strcpy(pcv->fileName, pname); /* ファイル名をワークに登録する */
setWinTitle(pcv); /* ウィンドウタイトルを設定する */
return 0;
}
/******************************************************************************
* saveFile(): ファイルのセーブ
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void saveFile(ComVal *pcv)
{
/* 疑似ダイアログを表示してファイル名を取得する */
TMCaret(pcv->tEditHdl, 0);
pcv->eseFlag = SAVE;
/* 疑似ダイアログに文字列を設定する */
setEseStr(&pcv->eseDlg, pcv->fileName, (int) strlen(pcv->fileName));
showEseDlg(&pcv->eseDlg);
}
/******************************************************************************
* getFileName(): 疑似ダイアログよりファイル名を取得する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int num = 1: [実行]ボタン
* = 2: [取消]ボタン
*/
void getFileName(ComVal *pcv, int num)
{
int mode, len;
char fWork[TS_NAMEMAX];
/* ファイル入出力モードを取得する */
mode = pcv->eseFlag;
if (mode == SAVE)
mode = NONE;
if (num == 1) { /* [実行]ボタンか? */
/* 入力文字列をワークにコピーする */
len = getEseStr(&pcv->eseDlg, fWork);
if (len == 0) {
/* 文字列が指定されていない場合 */
hideEseDlg(&pcv->eseDlg); /* 疑似ダイアログを消去する */
pcv->eseFlag = NONE;
TMCaret(pcv->tEditHdl, 1);
return;
}
fWork[len] = 0;
/* ファイル名とドライブの状態をチェックする */
if (!checkDrive(pcv, fWork, mode))
return;
strcpy(pcv->fileName, fWork);
setWinTitle(pcv); /* ウィンドウタイトルを設定する */
writeFile(pcv); /* ファイルへの書き込み */
}
hideEseDlg(&pcv->eseDlg); /* 疑似ダイアログを消去する */
setEseStr(&pcv->eseDlg, "", 0); /* 疑似ダイアログ文字列をクリアする */
pcv->eseFlag = NONE;
TMCaret(pcv->tEditHdl, 1);
}
/******************************************************************************
* checkDrive(): ファイル名、ドライブのチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* char *fName ファイル名へのポインタ
* int mode ファイルのアクセスモード
* = 0: 保存
* = 1: 読み込み
* 戻り値: BOOLEAN = TRUE: 正常終了
* = FALSE: 異常終了
*/
BOOLEAN checkDrive(ComVal *pcv, char *fName, int mode)
{
int stat;
struct NAMECKBUF nminf;
/* 入力されたファイル名を分解・検査 */
stat = NAMECK((unsigned char *) fName, &nminf);
if (stat != 0) {
pcv->errorCode = 14; /* ファイル名がおかしい */
return FALSE;
}
/* フルパス名を作成する */
strmfn(fName, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
/* 指定ファイル名のドライブの状態を取得する */
stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
/* ドライブが準備されているかをチェックする */
if ((stat & 0x06) != 0x02) {
pcv->errorCode = 15; /* 準備ができていない */
return FALSE;
}
/* プロテクトされているかどうかをチェックする */
if (mode == 0 && (stat & 0x0a) == 0x0a) {
pcv->errorCode = 16; /* ライトプロテクト */
return FALSE;
}
return TRUE;
}
/******************************************************************************
* writeFile(): ファイルへの書き込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 保存処理終了
* = FALSE: 取消または異常終了
*/
BOOLEAN writeFile(ComVal *pcv)
{
int len;
FILE *fn;
fn = fopen(pcv->fileName, "wb");
if (fn == NULL) {
pcv->errorCode = 13; /* ファイルができなかった */
pcv->fileName[0] = 0;
return FALSE;
}
TMCacheFlush(pcv->tEditHdl); /* キャッシュをフラッシュする */
/* ファイルに書き込む */
len = fwrite((unsigned char *) *(*pcv->tEditHdl)->text, sizeof(char), (size_t)(*pcv->tEditHdl)->length, fn);
if (len != (*pcv->tEditHdl)->length) {
pcv->errorCode = 12; /* ライトエラー */
pcv->fileName[0] = 0;
return FALSE;
}
/* ファイルの最後に EOF のコードを付加する */
fseek(fn, 0, SEEK_END);
fputc('\x1a', fn);
pcv->editFlag = FALSE; /* 編集フラグをクリアする */
fclose(fn);
return TRUE;
}